#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 1000
#define INF 0xfffffff
int n;
int map[N][N];
int lx[N],ly[N];
bool visx[N],visy[N];
int slock[N],used[N];
bool find(int x)
{
    int j,t;
    visx[x]=1;
    for(j=1;j<=n;j++)
    {
        if(visy[j]) continue;
        t=lx[x]+ly[j]-map[x][j];
        if(t==0)
        {
            visy[j]=1;
            if(used[j]==-1 || find(used[j]))
            {
                used[j]=x;
                return 1;
            }
        }
        else if(t<slock[j]) slock[j]=t;
    }
    return 0;
}
int Min(int a,int b)
{
    return a<b?a:b;
}
void KM()
{
    int i,j,d;
    memset(ly,0,sizeof(ly));
    memset(used,-1,sizeof(used));
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=n;j++) slock[j]=INF;
        for(;;)
        {
            memset(visx,0,sizeof(visx));
            memset(visy,0,sizeof(visy));
            if(find(i)) break;
            d=INF;
            for(j=1;j<=n;j++)
                if(!visy[j]) d=Min(d,slock[j]);
            for(j=1;j<=n;j++)
                if(visx[j]) lx[j]-=d;
            for(j=1;j<=n;j++)
                if(visy[j]) ly[j]+=d;
                else slock[j]-=d;
        }
    }
}
#include<vector>
using std::vector;
vector<int> xyl(vector<vector<int>> &cost)
{
    int i,j,sum;
   // while(scanf("%d",&n)!=EOF)
   n=cost.size();
//    {
            for(i=1;i<=n;i++)
            {
                lx[i]=0;
                for(j=1;j<=n;j++)
                {
                  //  scanf("%d",&map[i][j]);
				  map[i][j]=-cost[i-1][j-1];
                    if(map[i][j]>lx[i]) lx[i]=map[i][j];
                }
            }
            KM();
            sum=0;
			vector<int> ret;
            for(j=1;j<=n;j++)
			{
              //  sum+=map[used[j]][j];
			//	printf("used %d\n",used[j]);
				ret.push_back(used[j]-1);
			}
           // printf("%d\n",sum);
 //   }
    return ret;
}
//test
//
/*
int main()
{
vector<vector<int>> cost={{10,20},{23,12}};
auto ret=xyl(cost);
for(auto &e:ret)
printf("%d\n",e);
return 0;
}
*/
